home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / generic.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  19KB  |  826 lines

  1. /*
  2.  * generic.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * routines de gestion de page g‚n‚riques:
  7.  *
  8.  * History:
  9.  * --------
  10.  * 21.01.95: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "GENERIC.C v1.00 - 03.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>                    /* header standard */
  22.     #include <string.h>                    /* header tt de chaines */
  23.     #include    <stdlib.h>                    /* Pour malloc etc.. */
  24.     #include <tos.h>   
  25.  
  26. /*
  27.  * Custom headers:
  28.  */
  29.     #include    "ARB_OUT.H"
  30.     
  31.     #include "SPEC_PU.H"
  32.  
  33.     #include "DEF_ARBO.H"
  34.     #include "DATPG_PU.H"
  35.     #include "DBSYS_PU.H"
  36.     #include    "DEBUG_PU.H"    
  37.     #include    "SERV_PU.H"
  38.     #include    "LINE0_PU.H"
  39.     #include    "DBINT_PU.H"
  40.     #include    "IOFLD_PU.H"
  41.     #include "TERM_PU.H"
  42.     #include "TEXT_PU.H"
  43.     #include "ARBGENPU.H"
  44.  
  45. /*
  46.  * private
  47.  */
  48. char * Format_Number(
  49.             int        number,        /* In: Nbre … formatter */
  50.             int        n_Format,    /* In: Format d‚sir‚ */
  51.             int        n_Len );        /* In: Longueur du champ */
  52. char * Format_Date(
  53.             const time_t * timer,        /* In: Date … formatter */
  54.             int                n_Format );    /* In: Format d‚sir‚ */
  55. char * Format_FAttrib(
  56.             unsigned char    uc_Attrib,    /* In: Date … formatter */
  57.             int                n_Format );    /* In: Format d‚sir‚ */
  58. char * Format_Size(
  59.             size_t    size,            /* In: Date … formatter */
  60.             int        n_Format,    /* In: Format d‚sir‚ */
  61.             int        n_Len );        /* In: Longueur du champ */
  62.  
  63. /*
  64.  * --------------------------- METHODES -------------------------------
  65.  */
  66.  
  67.  
  68.  
  69. /*
  70.  * OutFields_DisplayGroup(-)
  71.  *
  72.  * Purpose:
  73.  * --------
  74.  * Affiche tous les champs d'un groupe donn‚
  75.  * Avec effacement pr‚alable pour les champs l'ayant demand‚
  76.  *
  77.  * History:
  78.  * --------
  79.  * 24.01.95: Created: new concept for data display
  80.  * 25.01.95: gŠre offsets
  81.  * 30.01.95: ne traite pas les champs disabled
  82.  * 24.03.95: gestion infos directory
  83.  */
  84. void    OutFields_DisplayGroup(
  85.                 VOIE    *    pVoie_curr,            /* In: Voie concern‚e */
  86.                 UINT        u_GroupId,            /* In: Groupe … afficher */
  87.                 int        n_XOffset,            /* In: Offsets … appliquer aux coordonn‚es des champs */            
  88.                 int        n_YOffset )
  89. {
  90.     PAGEARBO         *    pPageArbo = pVoie_curr -> arboparams;
  91.     ARBO_FIELDPARS    *     pFieldPars_Output;
  92.     OUTPUT_FPAR        *    pOutput_FPar;
  93.     OUTPUT_FPAR        *    pOutput_FPar_CurrScroll = NULL;
  94.     char                *    psz;
  95.  
  96.     /*
  97.      * Beaucoup de champs portent sur l'enregistrement
  98.      * en cours de visualisation:
  99.      */
  100.     COMPACT_RECORD    *    pCompactRec = pVoie_curr -> curr_comprec;
  101.     RECORD_NUMBER    *    pRecNumber    = NULL;
  102.     if( pCompactRec != NULL )
  103.     {    /*
  104.          * Num‚ro de diff‚rentiation de l'enregistrement:
  105.          */
  106.          pRecNumber    = &(pCompactRec -> data.header .header .rec_idnb); 
  107.     }
  108.  
  109.  
  110.     /*
  111.      * Champ scrollable courant:
  112.      */
  113.     if( pVoie_curr -> pIOField_CurrOut != NULL )
  114.     {
  115.         pOutput_FPar_CurrScroll = pVoie_curr -> pIOField_CurrOut -> FPar.Output;
  116.     }
  117.  
  118.  
  119.     /*
  120.      * -------------------------
  121.      * Parcourt tous les champs:
  122.      * En vue de leur effacement:
  123.      * -------------------------
  124.      */
  125.     for( pFieldPars_Output = pPageArbo -> output_fields ;
  126.             pFieldPars_Output != NULL ;
  127.              pFieldPars_Output = pFieldPars_Output -> next )
  128.     {
  129.         pOutput_FPar = &(pFieldPars_Output -> data.output);
  130.     
  131.         /*
  132.          * V‚rifie l'appartenance du champ au groupe demand‚:
  133.          */
  134.         if( pOutput_FPar -> OutFieldFlags.u_GroupId != u_GroupId
  135.             || pOutput_FPar -> OutFieldFlags.b_enabled == FALSE0 )
  136.         {    /*
  137.              * Ce champ ne nous int‚resse pas,
  138.              * on passe au suivant:
  139.              */
  140.             continue;
  141.         }
  142.  
  143.         /*
  144.          * Efface le champ:
  145.          */
  146.         OutField_Clear( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset );
  147.          
  148.     }
  149.  
  150.  
  151.     /*
  152.      * -------------------------
  153.      * Parcourt tous les champs:
  154.      * En vue de leur affichage:
  155.      * -------------------------
  156.      */
  157.     for( pFieldPars_Output = pPageArbo -> output_fields ;
  158.             pFieldPars_Output != NULL ;
  159.              pFieldPars_Output = pFieldPars_Output -> next )
  160.     {
  161.         pOutput_FPar = &(pFieldPars_Output -> data.output);
  162.     
  163.         /*
  164.          * V‚rifie l'appartenance du champ au groupe demand‚:
  165.          */
  166.         if( pOutput_FPar -> OutFieldFlags.u_GroupId != u_GroupId
  167.             || pOutput_FPar -> OutFieldFlags.b_enabled == FALSE0 )
  168.         {    /*
  169.              * Ce champ ne nous int‚resse pas,
  170.              * on passe au suivant:
  171.              */
  172.             continue;
  173.         }
  174.  
  175.         /* printf("\nAffiche champ: %o %d %x  ", pOutput_FPar -> fnct_no, pOutput_FPar -> fnct_no, pOutput_FPar -> fnct_no ); */
  176.          
  177.         if( pOutput_FPar_CurrScroll != NULL && pOutput_FPar_CurrScroll == pOutput_FPar )
  178.         {    /*
  179.              * S'il s'agit du champ principal en cours de consultation
  180.              * (celui qu'on peut scroller avec suite/retour)
  181.              * On affiche le texte d‚j… formatt‚ au pr‚alabale et on le
  182.              * garde en ram pour plus tard (scroll...):
  183.              */
  184.             OutField_Display( pVoie_curr, pVoie_curr -> pIOField_CurrOut, n_XOffset, n_YOffset );
  185.  
  186.             /*
  187.              * Passe au champ suivant:
  188.              */
  189.             continue;
  190.         }
  191.     
  192.     
  193.         /*
  194.          * En fonction du type de champ:
  195.          */
  196.         switch( pOutput_FPar -> fnct_no )
  197.         {
  198.             case    FO_COMMENT:
  199.             {    /*
  200.                  * Commentaire de la page arbo:
  201.                  */
  202.                 char *    cpsz_Comment = pVoie_curr -> arbopage -> comment;
  203.                 if( cpsz_Comment != NULL )
  204.                 {
  205.                     IOField_DisplayText( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, cpsz_Comment, strlen( cpsz_Comment ) );
  206.                 }
  207.                 break;
  208.             }
  209.             
  210.             
  211.             case    FO_DATACOMMENT:
  212.                 /*
  213.                  * Commentaire de la base de donn‚es affich‚e:
  214.                  */
  215.                 if( pVoie_curr -> database != NULL )
  216.                 {
  217.                     char *    cpsz_Comment = pVoie_curr -> database -> comment;
  218.                     if( cpsz_Comment != NULL )
  219.                     {
  220.                         IOField_DisplayText( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, cpsz_Comment, strlen( cpsz_Comment ) );
  221.                     }
  222.                 }
  223.                 break;
  224.  
  225.  
  226.             case    FO_TEXTCOMMENT:
  227.                 /*
  228.                  * Commentaire du texte affich‚:
  229.                  */
  230.                 if( pVoie_curr -> pDataPage_OpenText != NULL )
  231.                 {
  232.                     char *    cpsz_Comment = pVoie_curr -> pDataPage_OpenText -> comment;
  233.                     if( cpsz_Comment != NULL )
  234.                     {
  235.                         IOField_DisplayText( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, cpsz_Comment, strlen( cpsz_Comment ) );
  236.                     }
  237.                 }
  238.                 break;
  239.  
  240.  
  241.             case    FO_RECNUMBER:
  242.                 /*
  243.                  * No de record courant:
  244.                  */
  245.                 psz = Format_Number( pVoie_curr -> n_RecIndex_Curr, pOutput_FPar -> n_Format, pOutput_FPar -> w );
  246.                 IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  247.                 break;
  248.  
  249.  
  250.             case    FO_PAGENUMBER:
  251.                 /*
  252.                  * No de page courante:
  253.                  */
  254.                 psz = Format_Number( pVoie_curr -> n_PageNumber_Curr, pOutput_FPar -> n_Format, pOutput_FPar -> w );
  255.                 IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  256.                 break;
  257.  
  258.  
  259.             case    FO_CREATEDATE:
  260.                 /*
  261.                   * Date de cr‚ation RECORD:
  262.                   */
  263.                 if( pRecNumber == NULL )
  264.                 {
  265.                     break;
  266.                 }
  267.  
  268.                 psz = Format_Date( &(pRecNumber -> date), pOutput_FPar -> n_Format ); 
  269.                 IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  270.  
  271.                 break;
  272.             
  273.             
  274.             case    FO_PUBPRIV:
  275.                 /*
  276.                  * Enregsitrement public ou priv‚:
  277.                  */
  278.                 if( pRecNumber != NULL )
  279.                 {
  280.                     RECORD_FLAGS    RecFlags = CompRec_GetRecFlags( pCompactRec );
  281.                     const char *     cpsz_PubPriv;
  282.  
  283.                     if( RecFlags .b_Private )
  284.                     {
  285.                         cpsz_PubPriv = "V";
  286.                     }
  287.                     else
  288.                     {
  289.                         cpsz_PubPriv = "P";
  290.                     }
  291.                     IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, cpsz_PubPriv );
  292.                 }
  293.                 break;
  294.  
  295.             case    FO_PATH:            /* Chemin d'accŠs courant */        
  296.                 psz = pVoie_curr -> pMsz_Path;
  297.                 IOField_DisplayText( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz, len_String(psz) );
  298.                 break;
  299.                 
  300.             case    FO_NBFILES:
  301.                 /*
  302.                  * Nbre de fichiers ds dir courant:
  303.                  */
  304.                 psz = Format_Number( pVoie_curr -> nb_DirEnt, pOutput_FPar -> n_Format, pOutput_FPar -> w );
  305.                 IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  306.                 break;
  307.  
  308.             case    FO_FILENAME:    /* Nom de fichier */
  309.             case    FO_FILEATTRIB:    /* Nom de fichier */
  310.             case    FO_FILEDATE:    /* Date de maj du fichier */
  311.             case    FO_FILESIZE:    /* Taille du fichier */
  312.             {
  313.                 DIRENTRY    **    TpDirEnt = pVoie_curr -> TpDirEnt;
  314.                 DIRENTRY    *    pDirEnt;
  315.                 if( TpDirEnt == NULL )
  316.                 {
  317.                     break;
  318.                 }
  319.                 pDirEnt = TpDirEnt[ pVoie_curr -> n_RecIndex_Curr -1 ];
  320.                 
  321.                 switch( pOutput_FPar -> fnct_no )
  322.                 {
  323.                     case    FO_FILENAME:    /* Nom de fichier */
  324.                         psz = pDirEnt -> sz_fname;
  325.                         IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  326.                         break;
  327.     
  328.                     case    FO_FILEATTRIB:    /* Attributs */
  329.                         psz = Format_FAttrib( pDirEnt -> uc_attrib, pOutput_FPar -> n_Format ); 
  330.                         IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  331.                         break;
  332.     
  333.                     case    FO_FILEDATE:    /* Date de maj du fichier */
  334.                         psz = Format_Date( &(pDirEnt -> time_LastChange), pOutput_FPar -> n_Format ); 
  335.                         IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, psz );
  336.                         break;
  337.     
  338.                     case    FO_FILESIZE:    /* Taille du fichier */
  339.                         psz = Format_Size( pDirEnt -> ul_length, pOutput_FPar -> n_Format, pOutput_FPar -> w );
  340.                         IOField_DisplayString( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, G_tmp_buffer );
  341.                         break;
  342.                 }
  343.                 break;
  344.             }
  345.  
  346.             case    FO_USERNAME:    /* USER Login/Username/Pseudo */
  347.             case    FO_FIRSTNAME:    /* 1STN pr‚nom */
  348.             case    FO_LASTNAME:    /* LSTN nom */
  349.             case    FO_TITLE:        /* MTIT Aff du titre */
  350.             case    FO_TEXT:            /* MTXT Affichage du texte */
  351.             case    FO_DSTA:            /* DSTA Adresse destination */
  352.             case    FO_MPSE:            /* MPSE Pseudo Auteur */
  353.             /* case    DB_FIELD:     / user database code */
  354.             {    /*
  355.                  * On veut l'affichage d'un champ de base de donn‚es:
  356.                  * Il faut commencer par trouver ce champ dans le record courant:
  357.                  */
  358.                 COMPACT_FIELD *     pCompField = Find_FieldinCompactRecord( pCompactRec, pOutput_FPar -> ul_CodeChamp );
  359.                 if( pCompField == NULL || pCompField -> size_FieldLen == 0 )
  360.                 {    /*
  361.                      * Si le champ voulu n'est pas disponible dans ce record:
  362.                      */
  363.                     break;
  364.                 }
  365.  
  366.                 /* Affiche nom du champ: */
  367.                 /*    printf("Champ %c%c%c%c: ", rec_ptr[0], rec_ptr[1], rec_ptr[2], rec_ptr[3]); */
  368.  
  369.                 /*
  370.                  * Affichage du champ:
  371.                  */
  372.                 IOField_DisplayText( pVoie_curr, pOutput_FPar, n_XOffset, n_YOffset, (char*) (pCompField -> bytes), pCompField -> size_FieldLen );
  373.  
  374.                 break;            
  375.             }
  376.             
  377.             default:
  378.                 /*
  379.                  * Ne sait pas afficher ce champ:
  380.                  */
  381.                 ping();
  382.                 sprintf( G_tmp_buffer, "WARNING: Ne sait pas afficher OutField Fnct %d", pOutput_FPar -> fnct_no );
  383.                 add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  384.                 break;
  385.         }
  386.     }
  387.  
  388.  
  389. /*
  390.  * Format_Number(-)
  391.  *
  392.  * Formattage d'un nombre selon format d‚sir‚
  393.  *
  394.  * 26.03.95: Created
  395.  */  
  396. char * Format_Number(
  397.             int        number,        /* In: Nbre … formatter */
  398.             int        n_Format,    /* In: Format d‚sir‚ */
  399.             int        n_Len )        /* In: Longueur du champ */
  400. {
  401.     static    FNCTSPEC     fnspec_Numbers[]=
  402.     {
  403.         FMT_NUMBER_LEFT,    "%d",
  404.         FMT_NUMBER_RIGHT,    "%*d",
  405.         FMT_NUMBER_ZEROS,    "%0*d"
  406.     };
  407.     
  408.     const char * cpsz_Format = fnct_spec( fnspec_Numbers, n_Format ) -> fnct_name;
  409.  
  410.     if( n_Format < FMT_NUMBER_RIGHT )
  411.     {    /*
  412.          * La longueur du champ n'intervient pas!
  413.          */
  414.         sprintf( G_tmp_buffer, cpsz_Format, number );
  415.     }
  416.     else
  417.     { 
  418.         sprintf( G_tmp_buffer, cpsz_Format, n_Len, number );
  419.     }
  420.     
  421.     return    G_tmp_buffer;
  422. }
  423.  
  424.  
  425. /*
  426.  * Format_Date(-)
  427.  *
  428.  * Formattage d'une date selon format d‚sir‚
  429.  *
  430.  * 25.03.95: Created
  431.  */  
  432. char * Format_Date(
  433.             const time_t * timer,        /* In: Date … formatter */
  434.             int                n_Format )    /* In: Format d‚sir‚ */
  435. {
  436.     static    FNCTSPEC     fnspec_Dates[]=
  437.     {
  438.         FMT_DATE_STD,        "%T",                            /* Fri Mar 24 23:00:00 1995 */
  439.         FMT_DATE_JmAAHMS,    "%D %N %Y %H:%M:%S",        /* 24 Mar 1995 23:00:00 */
  440.         FMT_DATE_JmAHMS,    "%D %N %y %H:%M:%S",        /* 24 Mar 95 23:00:00 */
  441.         FMT_DATE_JMAAHMS,    "%D.%n.%Y %H:%M:%S",        /* 24.03.1995 23:00:00 */
  442.         FMT_DATE_JMAHMS,    "%D.%n.%y %H:%M:%S",        /* 24.03.95 23:00:00 */
  443.         FMT_DATE_JMHMS,    "%D/%n %H:%M:%S",            /* 24/03 23:00:00 */
  444.         FMT_DATE_JJMAHMS,    "%J %D.%n.%y %H:%M:%S",    /* Fri 24.03.95 23:00:00 */
  445.         FMT_DATE_JJMHMS,    "%J %D/%n %H:%M:%S",        /* Fri 24/03 23:00:00 */
  446.         FMT_DATE_HMS,        "%H:%M:%S",                    /* 23:00:00 */
  447.         FMT_DATE_HMSP,        "%h:%M:%S %P",                /* 11:00:00 PM */
  448.         FMT_DATE_HMP,        "%h:%M %P",                    /* 11:00 PM */
  449.         FMT_DATE_H,         "%Hh",                        /* 23h */
  450.     };
  451.     
  452.     const char * cpsz_Time = ctime( timer );
  453.     
  454.     const char * cpsz_Format = fnct_spec( fnspec_Dates, n_Format ) -> fnct_name;
  455.  
  456.     const char * cpiBsz_Format = cpsz_Format;
  457.     char          * piBsz_Output = G_tmp_buffer;
  458.     char                car;
  459.     
  460.     while( (car = *(cpiBsz_Format++) ) != '\0' )
  461.     {
  462.         if( car == '%' )
  463.         {    /*
  464.              * Il faut faire un remplacement:
  465.              * Selon code donn‚ aprŠs %
  466.              */
  467.             const char * cpsz_Srce;
  468.             size_t         size; 
  469.              
  470.              
  471.             switch( *(cpiBsz_Format++) )
  472.             {
  473.                 case    'D':
  474.                     /*
  475.                      * Date  24
  476.                      */
  477.                     cpsz_Srce = cpsz_Time+8;
  478.                     size = 2;
  479.                     break;
  480.  
  481.                 case    'H':
  482.                     /*
  483.                      * Heure 23
  484.                      */
  485.                     cpsz_Srce = cpsz_Time+11;
  486.                     size = 2;
  487.                     break;
  488.  
  489.                 case    'h':
  490.                 {    /*
  491.                      * Heure 11:
  492.                      */
  493.                     int heure = atoi( cpsz_Time+11 );    
  494.                     if( heure > 12 )
  495.                     {
  496.                         heure %= 12;
  497.                     }
  498.                     sprintf( G_2nd_buffer, "%02d", heure );
  499.                     cpsz_Srce = G_2nd_buffer;
  500.                     size = 2;
  501.                 }
  502.                     break;
  503.                     
  504.                 case    'J':
  505.                     /*
  506.                      * Jour    Fri
  507.                      */
  508.                     cpsz_Srce = cpsz_Time;
  509.                     size = 3;
  510.                     break;
  511.  
  512.                 case    'M':
  513.                     /*
  514.                      * Minutes 00
  515.                      */
  516.                     cpsz_Srce = cpsz_Time+14;
  517.                     size = 2;
  518.                     break;
  519.  
  520.                 case    'N':
  521.                     /*
  522.                      * Mois Mar
  523.                      */
  524.                     cpsz_Srce = cpsz_Time+4;
  525.                     size = 3;
  526.                     break;
  527.  
  528.                 case    'n':
  529.                     /*
  530.                      * Mois 03
  531.                      */
  532.                     cpsz_Srce = NULL;
  533.  
  534.                     switch( cpsz_Time[ 4 ] )
  535.                     {
  536.                         case    'A':
  537.                             switch( cpsz_Time[ 5 ] )
  538.                             {
  539.                                 case    'p':
  540.                                     cpsz_Srce = "04";
  541.                                     break;
  542.                                 
  543.                                 case    'u':
  544.                                     cpsz_Srce = "08";
  545.                                     break;
  546.                             }
  547.                             break;
  548.                             
  549.                         case    'D':
  550.                             cpsz_Srce = "12";
  551.                             break;
  552.                         
  553.                         case    'F':
  554.                             cpsz_Srce = "02";
  555.                             break;
  556.                         
  557.                         case    'J':
  558.                             switch( cpsz_Time[ 5 ] )
  559.                             {
  560.                                 case    'a':
  561.                                     cpsz_Srce = "01";
  562.                                     break;
  563.                                 
  564.                                 case    'u':
  565.                                     switch( cpsz_Time[ 6 ] )
  566.                                         {
  567.                                             case    'n':
  568.                                                 cpsz_Srce = "06";
  569.                                                 break;
  570.                                             
  571.                                             case    'l':
  572.                                                 cpsz_Srce = "07";
  573.                                                 break;
  574.                                         }
  575.                                         break;
  576.                                 }
  577.                             break;
  578.                             
  579.                         case    'M':
  580.                             switch( cpsz_Time[ 6 ] )
  581.                             {
  582.                                 case    'r':
  583.                                     cpsz_Srce = "03";
  584.                                     break;
  585.                                 
  586.                                 case    'y':
  587.                                     cpsz_Srce = "05";
  588.                                     break;
  589.                             }
  590.                             break;
  591.  
  592.                         case    'O':
  593.                             cpsz_Srce = "10";
  594.                             break;
  595.  
  596.                         case    'N':
  597.                             cpsz_Srce = "11";
  598.                             break;
  599.  
  600.                         case    'S':
  601.                             cpsz_Srce = "09";
  602.                             break;
  603.                     }
  604.  
  605.                     if( cpsz_Srce == NULL )
  606.                     {
  607.                         cpsz_Srce = "?m";
  608.                     }
  609.                     size = 2;
  610.                     break;
  611.  
  612.                 case    'P':
  613.                     /*
  614.                      * AM/PM
  615.                      */
  616.                     if( cpsz_Time[11] == '2' ||
  617.                          (cpsz_Time[11] == '1' && cpsz_Time[12] >= '2' ) )
  618.                     {
  619.                         cpsz_Srce = "PM";
  620.                     }
  621.                     else
  622.                     {
  623.                         cpsz_Srce = "AM";
  624.                     }
  625.                     size = 2;
  626.                     break;
  627.  
  628.                 case    'S':
  629.                     /*
  630.                      * Secondes 00
  631.                      */
  632.                     cpsz_Srce = cpsz_Time+17;
  633.                     size = 2;
  634.                     break;
  635.  
  636.                 case    'T':
  637.                     /*
  638.                      * Time complet
  639.                      */
  640.                     cpsz_Srce = cpsz_Time;
  641.                     size = 24;
  642.                     break;
  643.  
  644.                 case    'Y':
  645.                     /*
  646.                      * Year 1995
  647.                      */
  648.                     cpsz_Srce = cpsz_Time+20;
  649.                     size = 4;
  650.                     break;
  651.     
  652.                 case    'y':
  653.                     /*
  654.                      * year 95
  655.                      */
  656.                     cpsz_Srce = cpsz_Time+22;
  657.                     size = 2;
  658.                     break;
  659.  
  660.                 default:
  661.                     /*
  662.                      * Code non reconnu:
  663.                      */
  664.                     cpsz_Srce = "?%";
  665.                     size = 2;
  666.             }
  667.  
  668.             strncpy( piBsz_Output, cpsz_Srce, size );
  669.             piBsz_Output += size;
  670.         }
  671.         else
  672.         {    /*
  673.              * On insŠre le caractŠre tel quel:
  674.              */
  675.             *(piBsz_Output++) = car;        
  676.         }
  677.     }
  678.  
  679.     /*
  680.      * Fin de chaine:
  681.      */    
  682.     *piBsz_Output = '\0';
  683.  
  684.     return    G_tmp_buffer;
  685. }            
  686.  
  687.  
  688. /*
  689.  * Format_FAttrib(-)
  690.  *
  691.  * Formattage des attributs de fichier selon format d‚sir‚
  692.  *
  693.  * 26.03.95: Created
  694.  */  
  695. char * Format_FAttrib(
  696.             unsigned char    uc_Attrib,    /* In: Date … formatter */
  697.             int                n_Format )    /* In: Format d‚sir‚ */
  698. {
  699.     FAKE_USE( n_Format );
  700.     
  701.     strcpy( G_tmp_buffer, "-----" );
  702.     
  703.     if( uc_Attrib & FA_SUBDIR )
  704.     {
  705.         G_tmp_buffer[0] = 'D';
  706.     }
  707.  
  708.     if( uc_Attrib & FA_READONLY )
  709.     {
  710.         G_tmp_buffer[1] = 'R';
  711.     }
  712.  
  713.     if( uc_Attrib & FA_HIDDEN )
  714.     {
  715.         G_tmp_buffer[2] = 'H';
  716.     }
  717.  
  718.     if( uc_Attrib & FA_SYSTEM )
  719.     {
  720.         G_tmp_buffer[3] = 'S';
  721.     }
  722.  
  723.     if( uc_Attrib & FA_ARCHIVE )
  724.     {
  725.         G_tmp_buffer[4] = 'A';
  726.     }
  727.  
  728.     return    G_tmp_buffer;
  729. }
  730.  
  731.  
  732. /*
  733.  * Format_Size(-)
  734.  *
  735.  * Formattage d'une taille de fichier selon format d‚sir‚
  736.  *
  737.  * 26.03.95: Created
  738.  */  
  739. char * Format_Size(
  740.             size_t    size,            /* In: Date … formatter */
  741.             int        n_Format,    /* In: Format d‚sir‚ */
  742.             int        n_Len )        /* In: Longueur du champ */
  743. {
  744.     if( n_Format == FMT_FILESIZE_KOCTETS && size > 0)
  745.     {
  746.         size /= 1024;    
  747.         if( size == 0 )
  748.         {
  749.             size = 1;
  750.         }
  751.     }
  752.     
  753.     sprintf( G_tmp_buffer, "%*lu", n_Len, size );
  754.     
  755.     return    G_tmp_buffer;
  756. }
  757.  
  758.  
  759.  
  760. /*
  761.  * Generic_DisplayPageChange(-)
  762.  *
  763.  * Purpose:
  764.  * --------
  765.  * Affiche les informations de la nouvelle page
  766.  * … laquelle on vient de se rendre
  767.  *
  768.  * Notes:
  769.  * ------
  770.  * Egalement utilis‚ par DISPTEXT.C
  771.  *
  772.  * History:
  773.  * --------
  774.  * 19.12.94: fplanque: Created
  775.  * 13.01.95: effacement des champs qui vont ˆtre renouvel‚s
  776.  * 21.01.95: chang‚ nom depuis LectMsg_DisplayPageChange()
  777.  * 24.01.95: n'efface plus les champs: c auto matok now
  778.  */
  779. void    Generic_DisplayPageChange(
  780.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  781. {
  782.     register_action( pVoie_curr, DISP, FE_CHGPAGE, 0, NULL );        /* Demande affichage page ‚cran */
  783.     register_action( pVoie_curr, DPAG, 0, 0, NULL );        /* Affiche message */
  784.     register_action( pVoie_curr, CPOS, 0, 0, NULL );        /* Repositionne curseur pour continuer ‚dition */
  785.     register_action( pVoie_curr, WAIT, 0, 0, NULL );        /* Repasse en mode d'attente d'action */
  786. }
  787.  
  788.  
  789. /*
  790.  * Generic_DispPage(-)
  791.  *
  792.  * Purpose:
  793.  * --------
  794.  * Affiche une page du texte formatt‚ courant
  795.  *
  796.  * History:
  797.  * --------
  798.  * 18.12.94: fplanque: moved from LectMsg_DispMsg()
  799.  * 21.01.95: chang‚ nom depuis LectMsg_DispPage()
  800.  */
  801. void    Generic_DispPage(
  802.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  803. {
  804.  
  805.     /*
  806.      * Calcul du num‚ro de page:
  807.      */
  808.     if( pVoie_curr -> pIOField_CurrOut != NULL )
  809.     {
  810.         long  l_TopLineText = pVoie_curr -> pIOField_CurrOut -> l_TopLine;
  811.         int    nb_LinesOnPage = pVoie_curr -> pOutputFPar_CurrOut -> h;
  812.         pVoie_curr -> n_PageNumber_Curr = (int) (l_TopLineText / nb_LinesOnPage) + 1;
  813.     }
  814.     else
  815.     {
  816.         pVoie_curr -> n_PageNumber_Curr = 0;
  817.     }
  818.  
  819.     /*
  820.      * Affichage des champs du groupe 4:
  821.      * (MTXT, no page)
  822.      */
  823.     OutFields_DisplayGroup( pVoie_curr, 4, 0, 0 );
  824. }
  825.